package cn.com.pc.content.support.baby;

import cn.com.pc.content.domain.content.Content;
import cn.com.pc.content.domain.content.ContentType;
import cn.com.pc.content.domain.view.ArticleView;
import cn.com.pc.content.domain.view.ViewConverter;
import cn.com.pc.content.dto.ArticleDTO;
import cn.com.pc.content.dto.ContentDTO;
import cn.com.pc.content.support.util.CMSTOAppArticleUtil;
import cn.com.pc.content.support.util.HtmlCMSUtils;
import cn.com.pc.content.support.util.HtmlFilter34Pconline;
import cn.com.pc.content.util.BeanUtils;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import org.springframework.util.StringUtils;

import java.util.List;
import java.util.Map;

/**
 * 亲子快妈 文章转换为appView（用的是CMS文章转换方法）
 * bean 名称为PCBabyHappyMomArticleToAppViewConverter，该名称存入数据库content_view_property的converter列
 */
@Slf4j
@Service("PCBabyHappyMomArticleToAppViewConverter")
public class PCBabyHappyMomArticleToAppViewConverter implements ViewConverter {
    private static final String PAGE_SPLIT_REGEX = "(?i)<EPRO_SPLIT>";

    /**
     * CMS文章，问答正文转义，app内容不分页
     *
     * @param content    数据库中已有内容数据（创建内容时即为contentDTO，更新内容时为数据库中已有内容数据）
     * @param contentDTO 接口或kafka 传入的内容数据（创建内容时需要设为null）
     * @param viewType   视图类型
     * @return 转换后视图文本
     */
    @Override
    @SuppressWarnings("Duplicates")
    public String convert(Content content, ContentDTO contentDTO, String viewType) {
        //获取需要转换的正文和原视图oldView
        String text = null;
        ArticleView articleView = new ArticleView();
        BeanUtils.copyProperties(content, articleView);
        text = articleView.getText();
        String oldView = articleView.getViewData() == null ?
                null : articleView.getViewData().getOrDefault(viewType, null);

        //判断更新内容时是否需要视图转换：判断更新前后正文是否一样，一样则不进行视图转换，返回原视图文本
        if (contentDTO != null && StringUtils.hasText(oldView)) {
            ArticleDTO articleDTO = new ArticleDTO();
            BeanUtils.copyProperties(contentDTO, articleDTO);
            //更新内容时，更新参数中的正文
            String newText = articleDTO.getText();
            //更新参数中text 和原文章text 一样，则重新不进行视图转换
            if (StringUtils.hasText(newText) &&
                    StringUtils.hasText(text) &&
                    newText.equals(text)) {
                log.debug("Text is not update ,not need to View Convert ,contentType({}),Site({}),contentId({})/referId({});",
                        ContentType.Article, content.getSite(), content.getId(), content.getReferId());
                return oldView;
            }
            //原文章text 更新为更新参数中text
            text = newText;
        }

        //text 为空则不进行视图转换，避免更新文章时不更新text字段导致视图view为空
        if (!StringUtils.hasText(text)) {
            log.debug("Text is blank ,not need to View Convert，contentType({}),Site({}),contentId({})/referId({});",
                    ContentType.Article, content.getSite(), content.getId(), content.getReferId());
            return null;
        }

        //视图转换代码，由业务方提供
        StringBuffer textBuffer = null;
        try {
            int pageCount = CMSTOAppArticleUtil.getPageCount(text);
            //是否显示全文
            boolean allText = true;
            //是否压缩
            String zip = "";
            List<String> briefs = CMSTOAppArticleUtil.getBriefs();
            int briefsLen = briefs != null ? briefs.size() : 0;
            Map<String, String> briefMap = CMSTOAppArticleUtil.getBriefMap(briefs);
            //文章id
            String id = content.getReferId();

            /* 暂时替换优酷视频链接，绕过HtmlFilter3的处理*/
            text = text.replace("http://www.pconline.com.cn/youku/iframe.html", "_TempYoukuUrl_");
            //171113 新js2标签过滤规则调整
            text = text.replaceAll("(?i)<p><strong[^<^>]*?class=\"js2-16(\\sjs2-16Ext)?\"[^<^>]*?>[\\s\\S]*?</strong></p>", "")
                    .replaceAll("(?i)<strong[^<^>]*?class=\"js2-16(\\sjs2-16Ext)?\"[^<^>]*?>[\\s\\S]*?</strong>", "");
            //180122 js2改成了动态插入的形式
            text = text.replaceAll("(?i)<p><EPRO_PRODUCT2_JS>[\\s\\S]*?</EPRO_PRODUCT2_JS></p>", "")
                    .replaceAll("(?i)<EPRO_PRODUCT2_JS>[\\s\\S]*?</EPRO_PRODUCT2_JS>", "");


            textBuffer = new StringBuffer();
            String[] pageText = text.split(PAGE_SPLIT_REGEX);
            for (int i = 0; i < pageCount; i++) {
                //加入分页结构
                if (briefsLen > i && allText) {
                    String briefPage = "<div class=\"page-title\" >"
                            + " <span id=\"content_page_" + (i + 1) + "\">" + briefMap.get(i + 1) + "</span>"
                            + "</div>";
                    textBuffer.append(briefPage);
                }
                String tmpText = "";
                tmpText = new HtmlFilter34Pconline(zip == null, 450)
                        .process(HtmlCMSUtils.filterRefreshImg(pageText[i], id, "http://mrobot.pconline.com.cn/v3/cms/articles/"));
                tmpText = tmpText.replaceFirst("^(</p>|</div>)*(\\s*\\S*)", "$2").replaceFirst("(((<div>)|(<p>))*)$", "");
                tmpText = CMSTOAppArticleUtil.replaceMp3Tag(tmpText);
                textBuffer.append(tmpText);
                //仅显示一页
                if (!allText) {
                    break;
                }
            }
            log.debug("To View Convert success Site({}),Biz({}),contentId({})/referId({});",
                    content.getSite(), content.getBiz(), content.getId(), content.getReferId());
        } catch (Exception e) {
            log.error("To View Convert error Site({}),Biz({}),contentId({})/referId({}):",
                    content.getSite(), content.getBiz(), content.getId(), content.getReferId(), e);
            return null;
        }
        return textBuffer.toString();
    }
}

